<template>
<!-- 外框，固定宽度 -->
  <div class="wrap">
    <!-- 内部滚动框 -->
    <div id="box">
      <!-- 展示的文字 -->
      <div id="marquee">{{text}}</div>
      <!-- 文字副本，为了实现无缝滚动 -->
      <div id="copy"></div>
    </div>
    <!-- 为了获取text实际宽度 -->
    <div id="node">{{text}}</div>
  </div>
</template>
<script>
export default {
  name: 'Marquee',
  data () {
    return {
      text: ''
    }
  },
  methods: {
    move () {
      // 获取文字text 的计算后宽度  （由于overflow的存在，直接获取不到，需要独立的node计算）
      const width = document.getElementById('node').getBoundingClientRect().width
      const box = document.getElementById('box')
      const copy = document.getElementById('copy')
      copy.innerText = this.text // 文字副本填充
      let distance = 0 // 位移距离
      // 设置位移
      setInterval(function () {
        distance = distance - 1
        // 如果位移超过文字宽度，则回到起点
        if (-distance >= width) {
          distance = 16
        }
        box.style.transform = 'translateX(' + distance + 'px)'
      }, 20)
    },
    async gonggao() {
      const { data: res } = await this.$http.get('/gonggaos')
      if (res.meta.status !== 200) {
        return this.$message.error('获取公告列表失败！')
      }
      const i = res.gonggaosxx.length
      this.text = res.gonggaosxx[i - 1].neirong
    }
  },
  // 把父组件传入的arr转化成字符串
  mounted: function () {
    this.gonggao()
  },
  // 更新的时候运动
  updated: function () {
    this.move()
  }
}
</script>
<style scoped>
/* 限制外框宽度，隐藏多余的部分 */
.wrap {
  overflow: hidden;
}
/* 移动框宽度设置 */
#box {
  width: 80000%;
}
/* 文字一行显示 */
#box div {
  float: left;
}
/* 设置前后间隔 */
#marquee {
  margin: 0 16px 0 0;
}
/* 获取宽度的节点，隐藏掉 */
#node {
  position: absolute;
  z-index: -999;
  top: -999999px;
}
</style>
